# Copyright 2020 - 2022 The Litegapps Project
# Litegapps Functions
# By wahyu6070
#
print(){ ui_print "$1"; }
del (){ rm -rf "$@"; }
cdir (){ mkdir -p "$@"; }
printlog(){
	print "$1"
	if [ "$1" != " " ]; then
		echo "$1 [$(date '+%d/%m/%Y %H:%M:%S')]" >> $log
	else
		print "$1" >> $log
	fi
	}
sedlog(){
	echo "[Processing]  $1 [$(date '+%d/%m/%Y %H:%M:%S')]" >> $log
	}
	
while_log(){
	echo "$1" | tee -a $log
	}
listlog(){
	echo " " >> $log
	echo "---------- Folder List : $1 ----------" >> $log
	for w in $(find "$1" -type f); do
		echo "| $(du -sah $w | cut -f 1) | $w" >> $log
	done
	echo "--------------------------------------" >> $log
	echo " " >> $log
	}

getp(){ grep "^$1" "$2" | head -n1 | cut -d = -f 2; }

abort(){
	print " " | tee -a $log
	print "!!! $1" | tee -a $log
	print " " | tee -a $log
	exit 1
	}
	
find_slot() {
  local slot=$(getprop ro.boot.slot_suffix 2>/dev/null);
  [ "$slot" ] || slot=$( grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline |  cut -d\  -f1 |  cut -d= -f2);
  if [ ! "$slot" ]; then
    slot=$(getprop ro.boot.slot 2>/dev/null);
    [ "$slot" ] || slot=$( grep -o 'androidboot.slot=.*$' /proc/cmdline |  cut -d\  -f1 |  cut -d= -f2);
    [ "$slot" ] && slot=_$slot;
  fi;
  [ "$slot" ] && echo "$slot";
}

make_log(){
	#creating log
	if [ $(getp litegapps_type $MODPATH/module.prop) = litegapps_plus ]; then
		NAME_LOG=`echo "[LOG]litegapps++_$(getp version $MODPATH/module.prop).zip"`
	else
		NAME_LOG=`echo "[LOG]litegapps_$(getp version $MODPATH/module.prop).zip"`
	fi
	
	if [ $DEV_MODE = OFF ]; then
		printlog "- Make log"
	else
		printlog "- Make log to <$LITEGAPPS/$NAME_LOG>"
	fi
	
	getprop > $LITEGAPPS/log/get_prop
	
	for BLOG in $SYSTEM $PRODUCT $SYSTEM_EXT $VENDOR; do
		local BASENAME=`basename $BLOG`
		if [ -f $BLOG/build.prop ]; then
			cp -pf $BLOG/build.prop $LITEGAPPS/log/${BASENAME}_build.prop
		else
			echo "! /${BASENAME} is not detected <$BLOG/build.prop>" >> $LITEGAPPS/log/${BASENAME}_build.prop
		fi
	done
	
	if [ -d $LITEGAPPS/log ]; then
		for TR in $tmp $MODPATH $LITEGAPPS; do
			test -d $TR && listlog $TR
		done
		cd $LITEGAPPS/log
		test -f $LITEGAPPS/$NAME_LOG && del $LITEGAPPS/$NAME_LOG
		$bin/zip -r9 $LITEGAPPS/$NAME_LOG * >/dev/null 2>&1
		cd /
		del $LITEGAPPS/log
	fi
}
report_bug(){
	printlog " "
	printlog "___________________________"
	printlog "| installation failed !!! |"
	printlog "|_________________________|"
	printlog " known error •> $1"
	printlog "___________________________"
	make_log
	printlog " Please report bug !"
	printlog " send log : /sdcard/Android/litegapps/$NAME_LOG"
	printlog " send in group telegram https://t.me/litegappsgroup"
	printlog "____________________________"
	printlog " "
	del $MODPATH
	[ $TYPEINSTALL = "kopi" ] && del $KOPIMOD
	
	if ! $BOOTMODE; then
		#umount
		print "- Umounting partitions";
		restore_env
	fi
	exit 1
}

GET_PROP(){
	local LIST_PROP="
	$SYSTEM/build.prop
	$VENDOR/build.prop
	$PRODUCT/build.prop
	$SYSTEM_EXT/build.prop
	"
	local HJ VARPROP
	for HJ in $LIST_PROP; do
		if [ -f $HJ ] && grep -q "$1" "$HJ" 2>/dev/null; then
			VARPROP=`grep "^$1" "$HJ" | head -n1 | cut -d = -f 2`
			break
		fi
	done
	
	if [ "$VARPROP" ]; then
		echo "$VARPROP"
	elif [ "$(getprop $1)" ]; then
		getprop $1
	else
		return 1
	fi
	
	}
get_android_codename(){
	local input=$1
	case $input in
		21) echo "Lollipop" ;;
		22) echo "Lollipop" ;;
		23) echo "Marshmallow" ;;
		24) echo "Nougat" ;;
		25) echo "Nougat" ;;
		26) echo "Oreo" ;;
		27) echo "Oreo" ;;
		28) echo "Pie" ;;
		29) echo "Quince Tart" ;;
		30) echo "Red Velvet Cake" ;;
		31) echo "Snow Cone" ;;
		32) echo "Snow Cone" ;;
		33) echo "Tiramisu" ;;
		34) echo "Upside Down Cake" ;;
		*) echo "null" ;;
	 esac
	}
litegapps_info(){
MODULEVERSION=`getp version $MODPATH/module.prop`
MODULECODE=`getp versionCode $MODPATH/module.prop`
MODULENAME=`getp name $MODPATH/module.prop`
MODULEANDROID=`getp android $MODPATH/module.prop`
MODULEDATE=`getp date $MODPATH/module.prop`
MODULEAUTHOR=`getp author $MODPATH/module.prop`
[ -n "$system" ] || system="systemless"
[ -n "$TYPEINSTALL" ] || TYPEINSTALL="magisk module"
printlog "____________________________________"
printlog "|"
printlog "| Name            : $MODULENAME"
printlog "| Version         : $MODULEVERSION"
printlog "| Build date      : $MODULEDATE"
printlog "| By              : $MODULEAUTHOR"
case $TYPEINSTALL in
magisk)
printlog "| Mode            : systemless (Magisk Module)"
;;
*)
printlog "| Mode            : non systemless"
;;
esac
printlog "|___________________________________"
printlog "|"
printlog "| Telegram        : https://t.me/litegapps"
printlog "|___________________________________"
printlog "|              Device Info"
printlog "| Name Rom        : $(GET_PROP ro.build.display.id)"
if [ "$(GET_PROP ro.product.vendor.model)" ]; then
printlog "| Device          : $(GET_PROP ro.product.vendor.model)"
elif [ "$(GET_PROP ro.product.model)" ]; then
printlog "| Device          : $(GET_PROP ro.product.model)"
else
printlog "| Device          : null"
fi

if [ "$(GET_PROP ro.product.vendor.device)" ]; then
printlog "| Codename        : $(GET_PROP ro.product.vendor.device)"
elif [ "$(GET_PROP ro.product.device)" ]; then
printlog "| Codename        : $(GET_PROP ro.product.device)"
else
printlog "| Codename        : null"
fi
printlog "| Android Version : $(GET_PROP ro.build.version.release) ($(get_android_codename $(GET_PROP ro.build.version.sdk)))"
printlog "| Architecture    : $ARCH"
printlog "| Api             : $(GET_PROP ro.build.version.sdk)"
printlog "| Density         : $(GET_PROP ro.sf.lcd_density)"
if [ $(getprop ro.build.ab_update) = "true" ]; then
	printlog "| Seamless        : A/B (slot $(find_slot))"
else
	printlog "| Seamless        : A only"
fi
printlog "| BootMode        : $BOOTMODE"
sedlog "| System          : $SYSTEM"
printlog "|___________________________________"
sedlog "|          Developer Mode"
sedlog "| Boot Mode    : $BOOTMODE"
sedlog "| System       : $SYSTEM"
if [ -f /dev/block/by-name/super ]; then
	dynamic3=true
else
	dynamic3=false
fi
sedlog "| Dynamic Partition : $dynamic3"
sedlog "| Litegapps Type : $(getp litegapps_type $MODPATH/module.prop)"
sedlog "| Litegapps Compress : $(getp litegapps_apk_compress $MODPATH/module.prop)"
sedlog "|___________________________________"
sedlog "             Memory Info"
for W897 in /data /system /product /system_ext /vendor /dev; do
		if [ -d $W897 ]; then
		local FILESYSTEM=`df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f1`
		sedlog " Partition  = $W897"
		sedlog " Filesystem = $FILESYSTEM"
		sedlog " Mounted on = $(df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f6)"
		sedlog " Free       = $(df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f4)"
		sedlog " Usage      = $(df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f3)"
		sedlog " Total      = $(df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f2)"
		sedlog " Used %     = $(df -h $W897 | tail -n 1 | tr -s ' ' | cut -d' ' -f5)"
		sedlog " Type       = $(mount | grep $FILESYSTEM | tail -n 1 | tr -s ' ' | cut -d' ' -f5)"
		sedlog "____________________________________________"
		sedlog " "
		fi
done
}

ch_con(){
chcon -h u:object_r:system_file:s0 "$1" || sedlog "Failed chcon $1"
}

ch_con_r(){
chcon -hR u:object_r:system_file:s0 "$1" || sedlog "Failed chcon $1"
}

terminal_tips(){
	print " "
	print "  Thanks for using litegapps 😁"
	print " "
	printlog "*Tips"
	print "- Open Terminal"
	print "- su"
	print "- litegapps"
	print " "
	print " "
	}

	
partition_check(){
	printlog "- Checking Partition"
	mount > $LITEGAPPS/log/mount.txt
	for R in $SYSTEM $PRODUCT $SYSTEM_EXT; do
		if [ -d $R ] && [ "$(ls -A $R)" ]; then
			touch $R/litegapps_4678
			if [ -f $R/litegapps_4678 ]; then
				sedlog "<$R> is mount RW"
				del $R/litegapps_4678
			else
				sedlog "<$R> is mount RO"
			fi
		fi
	done
	}
get_android_version(){
	local input=$1
	case $input in
		21) echo 5.0 ;;
		22) echo 5.1 ;;
		23) echo 6.0 ;;
		24) echo 7.0 ;;
		25) echo 7.1 ;;
		26) echo 8.0 ;;
		27) echo 8.1 ;;
		28) echo 9.0 ;;
		29) echo 10.0 ;;
		30) echo 11.0 ;;
		31) echo 12.0 ;;
		32) echo 12.1 ;;
		33) echo 13.0 ;;
		34) echo 14.0 ;;
		*) echo null ;;
	 esac
	}
litegapps_plus(){
	test ! -d $tmp/$ARCH/$SDKTARGET && cdir $tmp/$ARCH/$SDKTARGET
	#sdk
	if [ -d $tmp/cross_sdk/$SDKTARGET ]; then
		cp -af $tmp/cross_sdk/$SDKTARGET/* $tmp/$ARCH/$SDKTARGET/
	else
		print "+ Architecture Support"
		for A1 in $(ls -1 $tmp/arch); do
			printlog "         $A1"
		done
		print "+ Android Version Support"
		for A2 in $(ls -1 $tmp/cross_sdk); do
			printlog "         $(get_android_version $A2)"
		done
		report_bug "Your Android Version Not Support (litegapps++)"
	fi

	#arch
	if [ -d $tmp/arch/$ARCH ]; then
		if [ $SDKTARGET -gt 28 ]; then
			cdir  $tmp/$ARCH/$SDKTARGET/system/product
			cp -af $tmp/arch/$ARCH/system/* $tmp/$ARCH/$SDKTARGET/system/product/
		else
			cp -af $tmp/arch/$ARCH/* $tmp/$ARCH/$SDKTARGET/
		fi
	fi
	#croos system
	if [ -d $tmp/cross_system ]; then
		if [ $SDKTARGET -gt 28 ]; then
			cdir $tmp/$ARCH/$SDKTARGET/system/product
			cp -af $tmp/cross_system/system/* $tmp/$ARCH/$SDKTARGET/system/product
		else
			cp -af $tmp/cross_system/* $tmp/$ARCH/$SDKTARGET/
		fi
	fi
	
	#api 23+
	if [ $SDKTARGET -ge 23 ] && [ $SDKTARGET -le 30 ] && [ -d $tmp/23 ]; then
		if [ $SDKTARGET -ge 29 ]; then
			cdir $tmp/$ARCH/$SDKTARGET/system/product/
			cp -af $tmp/23/$ARCH/system/* $tmp/$ARCH/$SDKTARGET/system/product/
		else
			cp -af $tmp/23/$ARCH/* $tmp/$ARCH/$SDKTARGET/
		fi
	#api 31+
	elif [ $SDKTARGET -ge 31 ] && [ $SDKTARGET -le 32 ] && [ -d $tmp/31 ]; then
		if [ $SDKTARGET -ge 29 ]; then
			cdir $tmp/$ARCH/$SDKTARGET/system/product/
			cp -af $tmp/31/$ARCH/system/* $tmp/$ARCH/$SDKTARGET/system/product/
		else
			cp -af $tmp/31/$ARCH/* $tmp/$ARCH/$SDKTARGET/
		fi
	fi
	}
	